home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / GW AdaEd 1.4.2 / GWAdaDemos / GWU Demos / parser.ada < prev    next >
Text File  |  1994-01-10  |  3KB  |  132 lines

  1. --
  2. --    Program : Parser.ada
  3. --    Author  : Charles Kann, The George Washington University
  4. --    Purpose : This program implements a recursive descent parser.  It is
  5. --      based on the recursive descent parser given in Aho, Sethi,
  6. --      and Ullman, "Principles, Techniques and Tools", 
  7. --      Addison-Wesley, 1986.  Note that symbols are limited to
  8. --      a single character.
  9. --
  10.  
  11. --    The purpose of this program is to show recursion, and how in showing that
  12. --    recursion the parse tree can be represented.
  13. --
  14. WITH Text_IO; USE Text_IO;
  15. PACKAGE Parser IS
  16.   PROCEDURE Parse;
  17. END;
  18.  
  19. PACKAGE BODY Parser IS
  20.  
  21.   Token : Character;
  22.   Token_Type : Character;
  23.  
  24.   -- "forward" declarations to accommodate mutual recursion
  25.   
  26.   PROCEDURE Lex;
  27.   PROCEDURE Expr;
  28.   PROCEDURE Factor;
  29.   PROCEDURE Term;
  30.         
  31.   PROCEDURE Parse IS
  32.   BEGIN
  33.     Lex;
  34.     Expr;
  35.   END Parse;
  36.     
  37.   PROCEDURE Lex IS
  38.   BEGIN
  39.     LOOP
  40.       IF NOT End_Of_Line THEN
  41.         GET( Token );
  42.         IF Token /= ' ' THEN
  43.           CASE Token IS
  44.             WHEN '+' | '-' =>
  45.               Token_Type := 'A';
  46.             WHEN '*' | '/' =>
  47.               Token_Type := 'M';
  48.             WHEN OTHERS =>
  49.               Token_Type := 'I';
  50.           END CASE;
  51.           EXIT;
  52.         END IF;
  53.       ELSE
  54.         Token_Type := ' ';
  55.         Token := ' ';
  56.         EXIT;
  57.       END IF;
  58.     END LOOP;
  59.   END Lex;
  60.  
  61.   PROCEDURE Expr IS
  62.     Save_Token : Character;
  63.   BEGIN
  64.     Term;
  65.     LOOP
  66.       IF Token = '+' OR Token = '-' THEN
  67.         Save_Token := Token;
  68.         Lex;
  69.         Term;
  70.         Put( Save_Token );        
  71.       ELSE
  72.         EXIT;
  73.       END IF;
  74.     END LOOP;
  75.   END Expr;
  76.  
  77.   PROCEDURE Term IS
  78.     Save_Token : Character;
  79.   BEGIN
  80.     Factor;
  81.     LOOP
  82.       IF Token = '*' OR Token = '/' THEN
  83.         Save_Token := Token;
  84.         Lex;
  85.         Factor;
  86.         Put( Save_Token );
  87.       ELSE
  88.         EXIT;
  89.       END IF;
  90.     END LOOP;
  91.   END Term;
  92.  
  93.   PROCEDURE Factor IS
  94.     Save_Token : Character;
  95.   BEGIN
  96.     IF Token = '(' THEN
  97.       Lex;
  98.       Expr;
  99.       IF Token /= ')' THEN
  100.         Put_Line(" ");
  101.         Put_Line( "Error, ')' expected, tossing token" );
  102.       ELSE
  103.         Lex;
  104.       END IF;
  105.     ELSE 
  106.       IF Token_Type = 'I' THEN
  107.         Put( Token );
  108.         Lex;
  109.       ELSE
  110.         Put_Line(" ");
  111.         Put( "Error, identifier expected, got ");
  112.         Put( Token );
  113.         New_Line;
  114.       END IF;
  115.     END IF;
  116.  
  117.   END Factor;
  118.  
  119. END Parser;
  120.  
  121.  
  122. WITH Text_IO; USE Text_IO;
  123. WITH Parser; USE Parser;
  124. PROCEDURE Parse_Expr IS
  125. BEGIN
  126.  
  127.   Put_Line( "Enter an expression to be parsed >" );
  128.   Parse;
  129.  
  130. END Parse_Expr;
  131.  
  132.